การเพิ่ม Custom Headers ใน CloudFront ไปยัง Origin Requests ของ ELB (ALB)
POP จากบริษัท Classmethod (Thailand) ครับ
สำหรับเว็บแอปพลิเคชันหรือเนื้อหาอื่นๆ ที่ให้บริการโดย Application Load Balancer ใน Elastic Load Balancing นั้น CloudFront สามารถแคชอ็อบเจ็กต์และให้บริการแก่ผู้ใช้โดยตรงได้ ซึ่งจะช่วยลด load ใน Application Load Balancer ของเรา นอกจากนี้ CloudFront ยังสามารถช่วยลดเวลาแฝงและแม้กระทั่งป้องกันการโจมตีแบบปฏิเสธการให้บริการ (DDoS) แบบกระจายได้
อย่างไรก็ตาม หากผู้ใช้สามารถเลี่ยงผ่าน CloudFront และเข้าถึง Application Load Balancer ของเราได้โดยตรง เราก็จะไม่ได้รับสิทธิประโยชน์เหล่านี้ แต่เราสามารถตั้งค่า Amazon CloudFront และ Application Load Balancer เพื่อป้องกันไม่ให้ผู้ใช้เข้าถึง Application Load Balancer โดยตรงได้ เพราะการตั้งค่านี้จะทำให้ผู้ใช้สามารถเข้าถึง Application Load Balancer ผ่าน CloudFront ได้เพียงช่องทางเดียวเท่านั้น ซึ่งเราจะได้รับประโยชน์จากการใช้ CloudFront ด้วยการตั้งค่าเหล่านี้
เพื่อป้องกันไม่ให้ผู้ใช้เข้าถึง Application Load Balancer โดยตรงและอนุญาตการเข้าถึงผ่าน CloudFront เท่านั้น ให้ทำการตั้งค่าตามขั้นตอนของบทความนี้ได้เลยครับ
สำหรับข้อมูลเพิ่มเติม ให้ดูที่ลิงก์ด้านล่างนี้
สิ่งที่ต้องมี
1. ต้องมี Load Balancers ใน EC2
เราสามารถสร้าง Load Balancers ใน EC2 หรือสร้างใน Elastic Beanstalk ก็ได้ ขอแค่ให้เป็น Load Balancers ก็ใช้ได้แล้ว ซึ่งการใช้งาน Elastic Load Balancing ปัจจุบันมีอยู่ 4 ประเภท แต่การสาธิตครั้งนี้ผมจะใช้วิธีการสร้าง Load Balancers แบบ ALB (Application Load Balancer) ใน Elastic Beanstalk โดยใช้งานอยู่ใน Region Singapore ครับ
สำหรับผู้ใช้งานที่ต้องการเรียนรู้การเริ่มต้นใช้งาน Elastic Load Balancing ผมจะแปะลิงก์ไว้ให้ด้านล่างนี้ครับ
การสร้าง Load Balancers ใน Elastic Beanstalk
การสร้าง Load Balancers ใน EC2
สำหรับการ Deploy Laravel ด้วย Elastic Beanstalk ดูได้ที่ลิงก์นี้
2. ต้องมี CloudFront ที่เชื่อมต่อกับ Load Balancers
ตรวจสอบ URL ก่อนตั้งค่า
URL ที่จะทำการตรวจสอบก็จะมีดังนี้
・URL ของ Elastic Beanstalk
・DNS name ของ Load Balancers
・Distribution domain name ของ CloudFront
URL ของ Elastic Beanstalk
เปิด Service Elastic Beanstalk แล้วเข้าไปที่หน้า Environment ของเรา แล้วคลิก url ได้เลย
http://[Environment name].[Active Region].elasticbeanstalk.com
DNS name ของ Load Balancers
เปิด Service EC2 แล้วเข้าไปที่หน้า Load Balancers ของเรา แล้วคัดลอก DNS name ไปวางในบราวเซอร์ที่เราใช้งาน
http://awseb-awseb-xxxxxxxxxx-xxxxxxxxxx.ap-southeast-1.elb.amazonaws.com/
Distribution domain name ของ CloudFront
เปิด Service CloudFront แล้วเข้าไปที่หน้า Distributions ของเรา แล้วคัดลอก Distribution domain name ไปวางในบราวเซอร์ที่เราใช้งาน
https://xxxxxxxxxx.cloudfront.net
ตั้งค่า Custom Headers ใน CloudFront
เราจะทำการตั้งค่า CloudFront โดยเพิ่ม Custom Header ให้กับคำขอที่ส่งไปยัง Application Load Balancer
เข้ามาที่ CloudFront > Distributions > ID ของเรา
จากนั้นเลือกหัวข้อOrigins
แล้วติ๊กที่ ⦿ Origin name ของเรา และคลิกEdit
เลื่อนลงมาด้านล่างสุดที่หัวข้อ Add custom header - optional แล้วคลิกAdd header
จากนั้นกำหนด Header name และ Value ตามที่เราต้องการ เช่น
Header name:ELB-CustomHeader
Value:loadbalance
แล้วกดSave changes
การตั้งค่านี้ก็เสร็จเรียบร้อย (แนะนำให้บันทึกค่านี้ไว้ด้วยเพื่อใช้ในขั้นตอนถัดไป)
ตั้งค่า Rules ใน Load Balancers
เราจะทำการตั้งค่า Application Load Balancer เพื่อส่งต่อคำขอที่มี HTTP header ที่กำหนดเองเท่านั้น โดยเพิ่ม Rule ใหม่สำหรับ Custom Headers ของ CloudFront และแก้ไข Rule (default) เพื่อบล็อกการเข้าถึงที่ไม่ผ่าน CloudFront ทั้งหมด
ผมได้ทำการสร้าง Load Balancers ไว้ก่อนหน้านี้ใน Region Singapore ดังนั้นผมจะทำการตั้งค่าใน Region Singapore
เพิ่ม Rules สำหรับ Custom Headers
เข้ามาที่ EC2 > Load Balancers
จากนั้นติ๊กที่■
awseb-AWSEB-xxxxxxxxxxxxx (Name ของเรา) ก็จะมีรายละเอียดแสดงที่ด้านล่าง
แล้วเลือกหัวข้อListeners
ก็จะมีรายละเอียดแสดงขึ้นมา ทีนี้ให้ดูที่คอลัมน์ Rules แล้วคลิกView/edit rules
ได้เลย
แล้วเลือกหัวข้อ+
และคลิก+ Insert Rule
แล้วจะมี Rule ใหม่เพิ่มขึ้นมา
แล้วดูที่คอลัมน์ IF(all match) ให้คลิก+ Add condition ⌵
แล้วเลือกHttp header...
แล้วจะมีช่องให้ใส่ Header name และ Value ให้ใส่เหมือนกับตอนที่เราตั้งค่าใน CloudFront เมื่อสักครู่นี้ (ต้องใส่ข้อมูลให้ตรงกันเท่านั้น) แล้วคลิก✓
ถัดมาดูที่คอลัมน์ THEN ให้คลิก+ Add action ⌵
แล้วเลือกForward to...
แล้วเลือก Target group ของเรา เช่นawseb-AWSEB-xxxxxxxxxxxx
และคลิก✓
เมื่อเสร็จแล้วจะแสดงแบบนี้ ให้ตรวจสอบความถูกต้องและคลิกSave
ได้เลย
แก้ไข Rules (default) บล็อกการเข้าถึงที่ไม่ผ่าน CloudFront
การแก้ไข Rules นี้คือการบล็อกการเข้าถึงที่ไม่ผ่าน CloudFront ทั้งหมด เราจะสามารถใช้ Distribution domain name ของ CloudFront ในการเข้าถึงหน้าเว็บไซต์ได้เพียงช่องทางเดียวเท่านั้น
URL ที่จะถูกบล็อกมีดังนี้
・URL ของ Elastic Beanstalk
・DNS name ของ Load Balancers
คลิกไอคอน?
ที่แท็บด้านบน แล้วคลิกไอคอน?
last HTTP 80: default action
คลิก+ Add action ⌵
แล้วเลือกReturn fixed response...
แล้วลองตั้งค่าตามนี้
Response code:403
Content-Type:text/plain
(กรณีที่ใส่ Error message เป็นข้อความธรรมดาให้เลือกแบบนี้)
Response body:Access Denied
(ใส่ข้อความอะไรก็ได้ ข้อความที่เราใส่จะแสดงเป็น Error message ในหน้าที่ถูกบล็อกการเข้าถึงตามนี้)
แล้วคลิก✓
ตรวรสอบความถูกต้องและคลิกUpdate
ได้เลย
หลังจากที่เราทำการตั้งค่าเหล่านี้แล้ว ผู้ใช้จะสามารถเข้าถึง Application Load Balancer ผ่าน CloudFront เท่านั้น ต่อไปเราจะทำการตรวจสอบ URL กันครับ
ตรวจสอบ URL หลังตั้งค่า
URL ที่จะทำการตรวจสอบก็จะมีดังนี้
・URL ของ Elastic Beanstalk
・DNS name ของ Load Balancers
・Distribution domain name ของ CloudFront
URL ของ Elastic Beanstalk
เปิด URL ของ Elastic Beanstalk ก็จะแสดง Error ตามที่เราได้ตั้งค่าไว้
http://[Environment name].[Active Region].elasticbeanstalk.com
DNS name ของ Load Balancers
เปิด DNS name ของ Load Balancers ก็จะแสดง Error ตามที่เราได้ตั้งค่าไว้
http://awseb-awseb-xxxxxxxxxx-xxxxxxxxxx.ap-southeast-1.elb.amazonaws.com/
Distribution domain name ของ CloudFront
เปิด Distribution domain name ของ CloudFront ก็จะเห็นว่าสามารถเข้าถึงหน้าเว็บไซต์ได้
https://xxxxxxxxxx.cloudfront.net
สรุป
ผมได้ตั้งค่า CloudFront เพื่อเพิ่ม Custom Headers ให้กับคำขอที่ส่งไปยัง Application Load Balancer และตั้งค่า Application Load Balancer เพื่อส่งต่อคำขอที่มี HTTP header ที่กำหนดเองเท่านั้น แล้วจะทำให้ผู้ใช้สามารถเข้าถึง Application Load Balancer ผ่าน CloudFront ได้เท่านั้น
หลังจากที่ผมได้ลองใช้จริงๆแล้ว โดยส่วนตัวผมคิดว่าเป็นฟังก์ชันที่ดีและทำให้ผมรู้สึกชอบฟังก์ชันนี้มากๆ เพราะจะทำให้เว็บไซต์ของเราลดโอกาสที่จะถูกโจมตีจากการเข้าถึงที่ไม่ได้รับอนุญาต แล้วเว็บไซต์ของเราก็จะมีความปลอดภัย ซึ่งผมอยากให้ผู้ใช้งาน AWS ได้รับสิทธิประโยชน์จากการใช้งาน CloudFront ดีๆแบบนี้ ยังไงก็ลองใช้งานกันดูนะครับ
ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ
POP จากบริษัท Classmethod (Thailand) ครับ !